package com.cee.admin.common;


import com.cee.common.exception.ChildPresenceDataException;
import com.cee.common.web.result.Result;
import com.cee.common.web.result.ResultBuilder;

import java.util.function.Supplier;

/**
 * 前后端分离后的 Api 基类
 *
 * @author rxliuli
 */
public abstract class BaseApi extends BaseController {


    /**
     * 成功后返回的值
     *
     * @param code 返回码
     * @param data 需要返回的数据
     * @param <T>  返回数据的类型
     * @return 经过 Result 包装后的数据
     */
    protected <T> Result<T> success(Integer code, T data) {
        return build(code, null, data);
    }


    /**
     * 失败后返回的值
     * 如果成功后需要返回消息，请使用 {@link BaseApi#success(Object)} 方法
     *
     * @param code 返回码
     * @param msg  错误消息
     * @return 经过 Result 包装后的数据
     */
    protected <T> Result<T> error(Integer code, String msg) {
        return build(code, msg, null);
    }

    /**
     * 包装一个 Result 对象
     *
     * @param code 返回码
     * @param msg  错误消息
     * @param data 需要返回的数据
     * @param <T>  返回数据的类型
     * @return 经过 Result 包装后的数据
     */
    protected <T> Result<T> build(Integer code, String msg, T data) {
        return new Result<>(code, msg, data);
    }

    /**
     * 包装一个 Result 对象
     *
     * @return 经过 Result 包装后的数据
     */
    protected Result<Boolean> build(Boolean result) {
        return ResultBuilder.build(result);
    }

    /**
     * 删除模板
     *
     * @param predicate
     * @return
     */
    protected Result<Boolean> deleteTemplate(Supplier<Boolean> predicate) {
        String msg;
        Exception ex;
        try {
            return success(predicate.get());
        } catch (ChildPresenceDataException e) {
            msg = e.getMessage();
            ex = e;
        } catch (Exception e) {
            msg = "网络错误";
            ex = e;
        }
        log.error(msg, ex);
        return error(msg);

    }
}
